/*
 * @lc app=leetcode.cn id=36 lang=javascript
 *
 * [36] 有效的数独
 */

// @lc code=start
/**
 * @param {character[][]} board
 * @return {boolean}
 */
// 利用二维数组装填行和列出现数值的个数
// 利用三维数组装填每个九宫格出现数值的个数
// 当数值出现的个数大于1则为false
var isValidSudoku = function(board) {
  let rows = Array.from({length: 9}, () => Array.from({length: 9}, () => [0]))
  let cols = Array.from({length: 9}, () => Array.from({length: 9}, () => [0]))
  let subboxes = Array.from({length: 3}, () => Array.from({length: 3}, () => Array.from({length: 9}, () => [0])))
  for (let y = 0; y < 9; y++) {
    for (let x = 0; x < 9; x++) {
      let item = board[y][x]
      if (item !== '.') {
        let index = +item - 1
        rows[y][index]++
        cols[index][x]++
        subboxes[Math.floor(y / 3)][Math.floor(x / 3)][index]++
        if (rows[y][index] > 1 || cols[index][x] > 1 || subboxes[Math.floor(y / 3)][Math.floor(x / 3)][index] > 1) return false
      }
    } 
  }
  return true
}
// @lc code=end

// var isValidSudoku = function(board) {
//   // 检测列
//   for (let x = 1; x <= 9; x++) {
//     if (!check(9, x, board, 0, x - 1)) return false
//   }
//   // 检测行
//   for (let y = 1; y <= 9; y++) {
//     if (!check(y, 9, board, y - 1, 0)) return false
//   }
//   // 检测9宫格
//   for (let y = 1; y <= 3; y++) {
//     for (let x = 1; x <= 3; x++) {
//       if (!check(y*3, x*3, board, (y - 1) * 3, (x - 1) * 3)) return false
//     }
//   }
//   return true
// };

// var check = function (yl, xl, board, inity = 0, initx = 0) {
//   let set = new Set()
//   for (let y = inity; y < yl; y++) {
//     for (let x = initx; x < xl; x++) {
//       let item = board[y][x]
//       if (set.has(item)) return false
//       if (item !== '.') set.add(item)
//     }
//   }
//   return true
// }